<!doctype html><html lang=zh class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel="shortcut icon" href=../../assets/images/favicon.png><meta name=generator content="mkdocs-1.1.2, mkdocs-material-5.5.13"><title>入门 - Dayet</title><link rel=stylesheet href=../../assets/stylesheets/main.077507d7.min.css><link rel=stylesheet href=../../assets/stylesheets/palette.ff0a5ce4.min.css><meta name=theme-color content=#546d78><link href=https://fonts.gstatic.com rel=preconnect crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700%7CConsolas&display=fallback"><style>body,input{font-family:"Roboto",-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Consolas",SFMono-Regular,Consolas,Menlo,monospace}</style><script>window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)},ga.l=+new Date,ga("create","UA-XXXXXXXX-X","auto"),ga("set","anonymizeIp",!0),ga("send","pageview"),document.addEventListener("DOMContentLoaded",function(){document.forms.search&&document.forms.search.query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})}),document.addEventListener("DOMContentSwitch",function(){ga("send","pageview",document.location.pathname)})</script><script async src=https://www.google-analytics.com/analytics.js></script></head> <body dir=ltr data-md-color-scheme data-md-color-primary=blue-grey data-md-color-accent=blue-grey> <input class=md-toggle data-md-toggle=drawer type=checkbox id=__drawer autocomplete=off> <input class=md-toggle data-md-toggle=search type=checkbox id=__search autocomplete=off> <label class=md-overlay for=__drawer></label> <div data-md-component=skip> <a href=#hadoop- class=md-skip> 跳转至 </a> </div> <div data-md-component=announce> </div> <header class=md-header data-md-component=header> <nav class="md-header-nav md-grid" aria-label=Header> <a href=../.. title=Dayet class="md-header-nav__button md-logo" aria-label=Dayet> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a3 3 0 003-3 3 3 0 00-3-3 3 3 0 00-3 3 3 3 0 003 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54z"/></svg> </a> <label class="md-header-nav__button md-icon" for=__drawer> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg> </label> <div class=md-header-nav__title data-md-component=header-title> <div class=md-header-nav__ellipsis> <span class="md-header-nav__topic md-ellipsis"> Dayet </span> <span class="md-header-nav__topic md-ellipsis"> 入门 </span> </div> </div> <label class="md-header-nav__button md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0116 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg> </label> <div class=md-search data-md-component=search role=dialog> <label class=md-search__overlay for=__search></label> <div class=md-search__inner role=search> <form class=md-search__form name=search> <input type=text class=md-search__input name=query aria-label=搜索 placeholder=搜索 autocapitalize=off autocorrect=off autocomplete=off spellcheck=false data-md-component=search-query data-md-state=active> <label class="md-search__icon md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0116 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg> </label> <button type=reset class="md-search__icon md-icon" aria-label=Clear data-md-component=search-reset tabindex=-1> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg> </button> </form> <div class=md-search__output> <div class=md-search__scrollwrap data-md-scrollfix> <div class=md-search-result data-md-component=search-result> <div class=md-search-result__meta> Initializing search </div> <ol class=md-search-result__list></ol> </div> </div> </div> </div> </div> <div class=md-header-nav__source> <a href=https://chokgit.gitee.io/blog title="前往 GitHub 仓库" class=md-source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><path d="M439.55 236.05L244 40.45a28.87 28.87 0 00-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 01-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 000 40.81l195.61 195.6a28.86 28.86 0 0040.8 0l194.69-194.69a28.86 28.86 0 000-40.81z"/></svg> </div> <div class=md-source__repository> 吾生也有崖，而知也无涯。 </div> </a> </div> </nav> </header> <div class=md-container data-md-component=container> <main class=md-main data-md-component=main> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component=navigation> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--primary" aria-label=Navigation data-md-level=0> <label class=md-nav__title for=__drawer> <a href=../.. title=Dayet class="md-nav__button md-logo" aria-label=Dayet> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a3 3 0 003-3 3 3 0 00-3-3 3 3 0 00-3 3 3 3 0 003 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54z"/></svg> </a> Dayet </label> <div class=md-nav__source> <a href=https://chokgit.gitee.io/blog title="前往 GitHub 仓库" class=md-source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><path d="M439.55 236.05L244 40.45a28.87 28.87 0 00-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 01-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 000 40.81l195.61 195.6a28.86 28.86 0 0040.8 0l194.69-194.69a28.86 28.86 0 000-40.81z"/></svg> </div> <div class=md-source__repository> 吾生也有崖，而知也无涯。 </div> </a> </div> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../.. title=主页 class=md-nav__link> 主页 </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-2 type=checkbox id=nav-2> <label class=md-nav__link for=nav-2> 系统基础 <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=系统基础 data-md-level=1> <label class=md-nav__title for=nav-2> <span class="md-nav__icon md-icon"></span> 系统基础 </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../%E7%B3%BB%E7%BB%9F/Linux/ title=Linux class=md-nav__link> Linux </a> </li> <li class=md-nav__item> <a href=../../%E7%B3%BB%E7%BB%9F/Shell/ title=Shell class=md-nav__link> Shell </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-3 type=checkbox id=nav-3> <label class=md-nav__link for=nav-3> 编程语言 <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=编程语言 data-md-level=1> <label class=md-nav__title for=nav-3> <span class="md-nav__icon md-icon"></span> 编程语言 </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../%E5%BF%85%E5%A4%87%E6%8A%80%E6%9C%AF/JavaSE/ title=Java class=md-nav__link> Java </a> </li> <li class=md-nav__item> <a href=../../%E5%BF%85%E5%A4%87%E6%8A%80%E6%9C%AF/Scala/ title=Scala class=md-nav__link> Scala </a> </li> <li class=md-nav__item> <a href=../../%E5%BF%85%E5%A4%87%E6%8A%80%E6%9C%AF/Python/ title=Python class=md-nav__link> Python </a> </li> <li class=md-nav__item> <a href=../../%E5%BF%85%E5%A4%87%E6%8A%80%E6%9C%AF/Kotlin/ title=Kotlin class=md-nav__link> Kotlin </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-4 type=checkbox id=nav-4> <label class=md-nav__link for=nav-4> 前端技术 <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=前端技术 data-md-level=1> <label class=md-nav__title for=nav-4> <span class="md-nav__icon md-icon"></span> 前端技术 </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../%E5%89%8D%E7%AB%AF/Vue/ title=Vue class=md-nav__link> Vue </a> </li> <li class=md-nav__item> <a href=../../%E5%89%8D%E7%AB%AF/Element-UI/ title=Element-UI-admin class=md-nav__link> Element-UI-admin </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-5 type=checkbox id=nav-5> <label class=md-nav__link for=nav-5> 后端技术 <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=后端技术 data-md-level=1> <label class=md-nav__title for=nav-5> <span class="md-nav__icon md-icon"></span> 后端技术 </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../%E5%90%8E%E7%AB%AF/SpringBoot/ title=SpringBoot class=md-nav__link> SpringBoot </a> </li> <li class=md-nav__item> <a href=../../%E5%90%8E%E7%AB%AF/Mybatis/ title=Mybatis class=md-nav__link> Mybatis </a> </li> <li class=md-nav__item> <a href=../../%E5%90%8E%E7%AB%AF/SpringData/ title=SpringData class=md-nav__link> SpringData </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-6 type=checkbox id=nav-6> <label class=md-nav__link for=nav-6> 中间件 <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=中间件 data-md-level=1> <label class=md-nav__title for=nav-6> <span class="md-nav__icon md-icon"></span> 中间件 </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../%E4%B8%AD%E9%97%B4%E4%BB%B6/Nginx/ title=Nginx class=md-nav__link> Nginx </a> </li> <li class=md-nav__item> <a href=../../%E4%B8%AD%E9%97%B4%E4%BB%B6/Tomcat/ title=Tomcat class=md-nav__link> Tomcat </a> </li> <li class=md-nav__item> <a href=../../%E4%B8%AD%E9%97%B4%E4%BB%B6/RabbitMQ/ title=RabbitMQ class=md-nav__link> RabbitMQ </a> </li> <li class=md-nav__item> <a href=../../%E4%B8%AD%E9%97%B4%E4%BB%B6/RocketMQ/ title=RocketMQ class=md-nav__link> RocketMQ </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-7 type=checkbox id=nav-7 checked> <label class=md-nav__link for=nav-7> 大数据 <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=大数据 data-md-level=1> <label class=md-nav__title for=nav-7> <span class="md-nav__icon md-icon"></span> 大数据 </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-7-1 type=checkbox id=nav-7-1 checked> <label class=md-nav__link for=nav-7-1> Hadoop <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Hadoop data-md-level=2> <label class=md-nav__title for=nav-7-1> <span class="md-nav__icon md-icon"></span> Hadoop </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" data-md-toggle=toc type=checkbox id=__toc> <label class="md-nav__link md-nav__link--active" for=__toc> 入门 <span class="md-nav__icon md-icon"></span> </label> <a href=./ title=入门 class="md-nav__link md-nav__link--active"> 入门 </a> <nav class="md-nav md-nav--secondary" aria-label=目录> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> 目录 </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=#1 class=md-nav__link> 第1章 大数据概论 </a> </li> <li class=md-nav__item> <a href=#11 class=md-nav__link> 1.1 大数据概念 </a> </li> <li class=md-nav__item> <a href=#12-4v class=md-nav__link> 1.2 大数据特点（4V） </a> </li> <li class=md-nav__item> <a href=#13 class=md-nav__link> 1.3 大数据应用场景 </a> </li> <li class=md-nav__item> <a href=#14 class=md-nav__link> 1.4 大数据发展前景 </a> </li> <li class=md-nav__item> <a href=#15 class=md-nav__link> 1.5 大数据部门业务流程分析 </a> </li> <li class=md-nav__item> <a href=#16 class=md-nav__link> 1.6 大数据部门组织结构 </a> </li> <li class=md-nav__item> <a href=#2-hadoop class=md-nav__link> 第2章 从Hadoop框架讨论大数据生态 </a> </li> <li class=md-nav__item> <a href=#21 class=md-nav__link> 2.1 大数据技术生态体系 </a> </li> <li class=md-nav__item> <a href=#22 class=md-nav__link> 2.2 推荐系统框架图 </a> </li> <li class=md-nav__item> <a href=#23-hadoop class=md-nav__link> 2.3 Hadoop是什么 </a> </li> <li class=md-nav__item> <a href=#24-hadoop class=md-nav__link> 2.4 Hadoop发展历史 </a> </li> <li class=md-nav__item> <a href=#25-hadoop class=md-nav__link> 2.5 Hadoop三大发行版本 </a> </li> <li class=md-nav__item> <a href=#26hadoop4 class=md-nav__link> 2.6Hadoop的优势（4高） </a> </li> <li class=md-nav__item> <a href=#27-hadoop class=md-nav__link> 2.7 Hadoop组成 </a> <nav class=md-nav aria-label="2.7 Hadoop组成"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#271-hdfs class=md-nav__link> 2.7.1 HDFS架构概述 </a> </li> <li class=md-nav__item> <a href=#272-yarn class=md-nav__link> 2.7.2 YARN架构概述 </a> </li> <li class=md-nav__item> <a href=#273-mapreduce class=md-nav__link> 2.7.3 MapReduce架构概述 </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#3-hadoop class=md-nav__link> 第3章 Hadoop运行环境搭建（开发重点） </a> </li> <li class=md-nav__item> <a href=#31 class=md-nav__link> 3.1 虚拟机环境准备 </a> </li> <li class=md-nav__item> <a href=#32-jdk class=md-nav__link> 3.2 安装JDK </a> </li> <li class=md-nav__item> <a href=#33-hadoop class=md-nav__link> 3.3 安装Hadoop </a> </li> <li class=md-nav__item> <a href=#34-hadoop class=md-nav__link> 3.4 Hadoop目录结构 </a> </li> <li class=md-nav__item> <a href=#4-hadoop class=md-nav__link> 第4章 Hadoop运行模式 </a> </li> <li class=md-nav__item> <a href=#41 class=md-nav__link> 4.1 本地运行模式 </a> <nav class=md-nav aria-label="4.1 本地运行模式"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#411-grep class=md-nav__link> 4.1.1 官方Grep案例 </a> </li> <li class=md-nav__item> <a href=#412-wordcount class=md-nav__link> 4.1.2 官方WordCount案例 </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#42 class=md-nav__link> 4.2 伪分布式运行模式 </a> <nav class=md-nav aria-label="4.2 伪分布式运行模式"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#421-hdfsmapreduce class=md-nav__link> 4.2.1 启动HDFS并运行MapReduce程序 </a> </li> <li class=md-nav__item> <a href=#422-yarnmapreduce class=md-nav__link> 4.2.2 启动YARN并运行MapReduce程序 </a> </li> <li class=md-nav__item> <a href=#423 class=md-nav__link> 4.2.3 配置历史服务器 </a> </li> <li class=md-nav__item> <a href=#424 class=md-nav__link> 4.2.4 配置日志的聚集 </a> </li> <li class=md-nav__item> <a href=#425 class=md-nav__link> 4.2.5 配置文件说明 </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#43 class=md-nav__link> 4.3 完全分布式运行模式（重点） </a> <nav class=md-nav aria-label="4.3 完全分布式运行模式（重点）"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#431 class=md-nav__link> 4.3.1 虚拟机准备 </a> </li> <li class=md-nav__item> <a href=#432-xsync class=md-nav__link> 4.3.2 编写集群分发脚本xsync </a> </li> <li class=md-nav__item> <a href=#433 class=md-nav__link> 4.3.3 集群配置 </a> </li> <li class=md-nav__item> <a href=#434 class=md-nav__link> 4.3.4 集群单点启动 </a> </li> <li class=md-nav__item> <a href=#435-ssh class=md-nav__link> 4.3.5 SSH无密登录配置 </a> </li> <li class=md-nav__item> <a href=#436 class=md-nav__link> 4.3.6 群起集群 </a> </li> <li class=md-nav__item> <a href=#437 class=md-nav__link> 4.3.7 集群启动/停止方式总结 </a> </li> <li class=md-nav__item> <a href=#438 class=md-nav__link> 4.3.8 集群时间同步 </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#5-hadoop class=md-nav__link> 第5章 Hadoop编译源码（重点） </a> </li> <li class=md-nav__item> <a href=#51 class=md-nav__link> 5.1 前期准备工作 </a> </li> <li class=md-nav__item> <a href=#52-jar class=md-nav__link> 5.2 jar包安装 </a> </li> <li class=md-nav__item> <a href=#53 class=md-nav__link> 5.3 编译源码 </a> </li> <li class=md-nav__item> <a href=#6 class=md-nav__link> 第6章 常见错误及解决方案 </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../Hadoop-HDFS/ title=HDFS class=md-nav__link> HDFS </a> </li> <li class=md-nav__item> <a href=../Hadoop-MapReduce/ title=MapReduce class=md-nav__link> MapReduce </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-7-2 type=checkbox id=nav-7-2> <label class=md-nav__link for=nav-7-2> Spark <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Spark data-md-level=2> <label class=md-nav__title for=nav-7-2> <span class="md-nav__icon md-icon"></span> Spark </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../Spark%E5%9F%BA%E7%A1%80/ title=Spark基础 class=md-nav__link> Spark基础 </a> </li> <li class=md-nav__item> <a href=../SparkCore/ title=SparkCore class=md-nav__link> SparkCore </a> </li> <li class=md-nav__item> <a href=../SparkSql/ title=SparkSql class=md-nav__link> SparkSql </a> </li> <li class=md-nav__item> <a href=../SparkStreaming/ title=SparkStreaming class=md-nav__link> SparkStreaming </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../Flink/ title=Flink class=md-nav__link> Flink </a> </li> <li class=md-nav__item> <a href=../Zookeeper/ title=Zookeeper class=md-nav__link> Zookeeper </a> </li> <li class=md-nav__item> <a href=../Hbase/ title=HBase class=md-nav__link> HBase </a> </li> <li class=md-nav__item> <a href=../Hive/ title=Hive class=md-nav__link> Hive </a> </li> <li class=md-nav__item> <a href=../Kafka/ title=Kafka class=md-nav__link> Kafka </a> </li> <li class=md-nav__item> <a href=../Flume/ title=Flume class=md-nav__link> Flume </a> </li> <li class=md-nav__item> <a href=../Sqoop/ title=Sqoop class=md-nav__link> Sqoop </a> </li> <li class=md-nav__item> <a href=../Oozie/ title=Oozie class=md-nav__link> Oozie </a> </li> <li class=md-nav__item> <a href=../Azkaban/ title=Azkaban class=md-nav__link> Azkaban </a> </li> <li class=md-nav__item> <a href=../Kylin/ title=Kylin class=md-nav__link> Kylin </a> </li> <li class=md-nav__item> <a href=../Presto/ title=Presto class=md-nav__link> Presto </a> </li> <li class=md-nav__item> <a href=../ELK/ title=ELK class=md-nav__link> ELK </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-8 type=checkbox id=nav-8> <label class=md-nav__link for=nav-8> 数据库 <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=数据库 data-md-level=1> <label class=md-nav__title for=nav-8> <span class="md-nav__icon md-icon"></span> 数据库 </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../%E5%BF%85%E5%A4%87%E6%8A%80%E6%9C%AF/Mysql%E5%AE%89%E8%A3%85/ title=Mysql安装 class=md-nav__link> Mysql安装 </a> </li> <li class=md-nav__item> <a href=../../%E5%BF%85%E5%A4%87%E6%8A%80%E6%9C%AF/Oracle%E5%AE%89%E8%A3%85/ title=Oracle安装 class=md-nav__link> Oracle安装 </a> </li> <li class=md-nav__item> <a href=../../%E5%BF%85%E5%A4%87%E6%8A%80%E6%9C%AF/Redis%E5%AE%89%E8%A3%85/ title=Redis安装 class=md-nav__link> Redis安装 </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-9 type=checkbox id=nav-9> <label class=md-nav__link for=nav-9> 项目开发 <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=项目开发 data-md-level=1> <label class=md-nav__title for=nav-9> <span class="md-nav__icon md-icon"></span> 项目开发 </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91/Web%E5%BC%80%E5%8F%91/ title=Web开发 class=md-nav__link> Web开发 </a> </li> <li class=md-nav__item> <a href=../../%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91/%E5%AE%89%E5%8D%93%E5%BC%80%E5%8F%91/ title=安卓开发 class=md-nav__link> 安卓开发 </a> </li> <li class=md-nav__item> <a href=../../%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91/PC%E7%AB%AF%E5%BC%80%E5%8F%91/ title=PC端开发 class=md-nav__link> PC端开发 </a> </li> <li class=md-nav__item> <a href=../../%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91/%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%BC%80%E5%8F%91/ title=大数据开发 class=md-nav__link> 大数据开发 </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-10 type=checkbox id=nav-10> <label class=md-nav__link for=nav-10> 必备技能 <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=必备技能 data-md-level=1> <label class=md-nav__title for=nav-10> <span class="md-nav__icon md-icon"></span> 必备技能 </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../%E5%BF%85%E5%A4%87%E6%8A%80%E6%9C%AF/Git/ title=Git class=md-nav__link> Git </a> </li> <li class=md-nav__item> <a href=../../%E5%BF%85%E5%A4%87%E6%8A%80%E6%9C%AF/Zabbix5/ title=Zabbix class=md-nav__link> Zabbix </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-11 type=checkbox id=nav-11> <label class=md-nav__link for=nav-11> 常用工具 <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=常用工具 data-md-level=1> <label class=md-nav__title for=nav-11> <span class="md-nav__icon md-icon"></span> 常用工具 </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7/IDEA/ title=IDEA class=md-nav__link> IDEA </a> </li> <li class=md-nav__item> <a href=../../%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7/Wiki/ title=Wiki class=md-nav__link> Wiki </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=nav-12 type=checkbox id=nav-12> <label class=md-nav__link for=nav-12> 面试题库 <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=面试题库 data-md-level=1> <label class=md-nav__title for=nav-12> <span class="md-nav__icon md-icon"></span> 面试题库 </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7/IDEA/ title=编程语言 class=md-nav__link> 编程语言 </a> </li> <li class=md-nav__item> <a href=../../%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7/IDEA/ title=系统操作 class=md-nav__link> 系统操作 </a> </li> <li class=md-nav__item> <a href=../../%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7/IDEA/ title=数据库 class=md-nav__link> 数据库 </a> </li> <li class=md-nav__item> <a href=../../%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7/IDEA/ title=大数据 class=md-nav__link> 大数据 </a> </li> <li class=md-nav__item> <a href=../../%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7/IDEA/ title=项目 class=md-nav__link> 项目 </a> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component=toc> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--secondary" aria-label=目录> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> 目录 </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=#1 class=md-nav__link> 第1章 大数据概论 </a> </li> <li class=md-nav__item> <a href=#11 class=md-nav__link> 1.1 大数据概念 </a> </li> <li class=md-nav__item> <a href=#12-4v class=md-nav__link> 1.2 大数据特点（4V） </a> </li> <li class=md-nav__item> <a href=#13 class=md-nav__link> 1.3 大数据应用场景 </a> </li> <li class=md-nav__item> <a href=#14 class=md-nav__link> 1.4 大数据发展前景 </a> </li> <li class=md-nav__item> <a href=#15 class=md-nav__link> 1.5 大数据部门业务流程分析 </a> </li> <li class=md-nav__item> <a href=#16 class=md-nav__link> 1.6 大数据部门组织结构 </a> </li> <li class=md-nav__item> <a href=#2-hadoop class=md-nav__link> 第2章 从Hadoop框架讨论大数据生态 </a> </li> <li class=md-nav__item> <a href=#21 class=md-nav__link> 2.1 大数据技术生态体系 </a> </li> <li class=md-nav__item> <a href=#22 class=md-nav__link> 2.2 推荐系统框架图 </a> </li> <li class=md-nav__item> <a href=#23-hadoop class=md-nav__link> 2.3 Hadoop是什么 </a> </li> <li class=md-nav__item> <a href=#24-hadoop class=md-nav__link> 2.4 Hadoop发展历史 </a> </li> <li class=md-nav__item> <a href=#25-hadoop class=md-nav__link> 2.5 Hadoop三大发行版本 </a> </li> <li class=md-nav__item> <a href=#26hadoop4 class=md-nav__link> 2.6Hadoop的优势（4高） </a> </li> <li class=md-nav__item> <a href=#27-hadoop class=md-nav__link> 2.7 Hadoop组成 </a> <nav class=md-nav aria-label="2.7 Hadoop组成"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#271-hdfs class=md-nav__link> 2.7.1 HDFS架构概述 </a> </li> <li class=md-nav__item> <a href=#272-yarn class=md-nav__link> 2.7.2 YARN架构概述 </a> </li> <li class=md-nav__item> <a href=#273-mapreduce class=md-nav__link> 2.7.3 MapReduce架构概述 </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#3-hadoop class=md-nav__link> 第3章 Hadoop运行环境搭建（开发重点） </a> </li> <li class=md-nav__item> <a href=#31 class=md-nav__link> 3.1 虚拟机环境准备 </a> </li> <li class=md-nav__item> <a href=#32-jdk class=md-nav__link> 3.2 安装JDK </a> </li> <li class=md-nav__item> <a href=#33-hadoop class=md-nav__link> 3.3 安装Hadoop </a> </li> <li class=md-nav__item> <a href=#34-hadoop class=md-nav__link> 3.4 Hadoop目录结构 </a> </li> <li class=md-nav__item> <a href=#4-hadoop class=md-nav__link> 第4章 Hadoop运行模式 </a> </li> <li class=md-nav__item> <a href=#41 class=md-nav__link> 4.1 本地运行模式 </a> <nav class=md-nav aria-label="4.1 本地运行模式"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#411-grep class=md-nav__link> 4.1.1 官方Grep案例 </a> </li> <li class=md-nav__item> <a href=#412-wordcount class=md-nav__link> 4.1.2 官方WordCount案例 </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#42 class=md-nav__link> 4.2 伪分布式运行模式 </a> <nav class=md-nav aria-label="4.2 伪分布式运行模式"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#421-hdfsmapreduce class=md-nav__link> 4.2.1 启动HDFS并运行MapReduce程序 </a> </li> <li class=md-nav__item> <a href=#422-yarnmapreduce class=md-nav__link> 4.2.2 启动YARN并运行MapReduce程序 </a> </li> <li class=md-nav__item> <a href=#423 class=md-nav__link> 4.2.3 配置历史服务器 </a> </li> <li class=md-nav__item> <a href=#424 class=md-nav__link> 4.2.4 配置日志的聚集 </a> </li> <li class=md-nav__item> <a href=#425 class=md-nav__link> 4.2.5 配置文件说明 </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#43 class=md-nav__link> 4.3 完全分布式运行模式（重点） </a> <nav class=md-nav aria-label="4.3 完全分布式运行模式（重点）"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#431 class=md-nav__link> 4.3.1 虚拟机准备 </a> </li> <li class=md-nav__item> <a href=#432-xsync class=md-nav__link> 4.3.2 编写集群分发脚本xsync </a> </li> <li class=md-nav__item> <a href=#433 class=md-nav__link> 4.3.3 集群配置 </a> </li> <li class=md-nav__item> <a href=#434 class=md-nav__link> 4.3.4 集群单点启动 </a> </li> <li class=md-nav__item> <a href=#435-ssh class=md-nav__link> 4.3.5 SSH无密登录配置 </a> </li> <li class=md-nav__item> <a href=#436 class=md-nav__link> 4.3.6 群起集群 </a> </li> <li class=md-nav__item> <a href=#437 class=md-nav__link> 4.3.7 集群启动/停止方式总结 </a> </li> <li class=md-nav__item> <a href=#438 class=md-nav__link> 4.3.8 集群时间同步 </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#5-hadoop class=md-nav__link> 第5章 Hadoop编译源码（重点） </a> </li> <li class=md-nav__item> <a href=#51 class=md-nav__link> 5.1 前期准备工作 </a> </li> <li class=md-nav__item> <a href=#52-jar class=md-nav__link> 5.2 jar包安装 </a> </li> <li class=md-nav__item> <a href=#53 class=md-nav__link> 5.3 编译源码 </a> </li> <li class=md-nav__item> <a href=#6 class=md-nav__link> 第6章 常见错误及解决方案 </a> </li> </ul> </nav> </div> </div> </div> <div class=md-content> <article class="md-content__inner md-typeset"> <h1 id=hadoop-><center>Hadoop-基础</center></h1> <h2 id=1>第1章 大数据概论</h2> <h2 id=11>1.1 大数据概念</h2> <h2 id=12-4v>1.2 大数据特点（4V）</h2> <p>大数据特点如图2-2，2-3，2-4，2-5所示</p> <p>图2-2 大数据特点之大量</p> <p>图2-3 大数据特点之高速</p> <p>图2-4 大数据特点之多样</p> <p>图2-5 大数据特点之低价值密度</p> <h2 id=13>1.3 大数据应用场景</h2> <p>大数据应用场景如图2-6，2-7，2-8，2-9，2-10，2-11所示</p> <p>图2-6 大数据应用场景之物流仓储</p> <p>图2-7 大数据应用场景之零售</p> <p>图2-8 大数据应用场景之旅游</p> <p>图2-9 大数据应用场景之商品广告推荐</p> <p>图2-10 大数据应用场景之保险、金融及房产</p> <p>图2-11 大数据应用场景人工智能</p> <h2 id=14>1.4 大数据发展前景</h2> <p>大数据发展前景如图所示</p> <p>图2-12 大数据发展前景之国家政策</p> <h2 id=15>1.5 大数据部门业务流程分析</h2> <p>大数据部门业务流程分析如图2-17所示。</p> <p>图2-17 大数据部门业务流程分析</p> <h2 id=16>1.6 大数据部门组织结构</h2> <p>大数据部门组织结构，适用于大中型企业，如图2-18所示。</p> <p>图2-18 大数据部门组织结构</p> <h2 id=2-hadoop>第2章 从Hadoop框架讨论大数据生态</h2> <h2 id=21>2.1 大数据技术生态体系</h2> <p>大数据技术生态体系如图2-26所示。</p> <p>图2-26 大数据技术生态体系</p> <p>图中涉及的技术名词解释如下：</p> <p>1）Sqoop：Sqoop是一款开源的工具，主要用于在Hadoop、Hive与传统的数据库(MySql)间进行数据的传递，可以将一个关系型数据库（例如 ：MySQL，Oracle 等）中的数据导进到Hadoop的HDFS中，也可以将HDFS的数据导进到关系型数据库中。</p> <p>2）Flume：Flume是Cloudera提供的一个高可用的，高可靠的，分布式的海量日志采集、聚合和传输的系统，Flume支持在日志系统中定制各类数据发送方，用于收集数据；同时，Flume提供对数据进行简单处理，并写到各种数据接受方（可定制）的能力。</p> <p>3）Kafka：Kafka是一种高吞吐量的分布式发布订阅消息系统，有如下特性：</p> <p>（1）通过O(1)的磁盘数据结构提供消息的持久化，这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。</p> <blockquote> <p>（2）高吞吐量：即使是非常普通的硬件Kafka也可以支持每秒数百万的消息。</p> <p>（3）支持通过Kafka服务器和消费机集群来分区消息。</p> <p>（4）支持Hadoop并行数据加载。</p> </blockquote> <p>4）Storm：Storm用于“连续计算”，对数据流做连续查询，在计算时就将结果以流的形式输出给用户。</p> <p>5）Spark：Spark是当前最流行的开源大数据内存计算框架。可以基于Hadoop上存储的大数据进行计算。</p> <p>6）Oozie：Oozie是一个管理Hdoop作业（job）的工作流程调度管理系统。</p> <p>7）Hbase：HBase是一个分布式的、面向列的开源数据库。HBase不同于一般的关系数据库，它是一个适合于非结构化数据存储的数据库。</p> <p>8）Hive：Hive是基于Hadoop的一个数据仓库工具，可以将结构化的数据文件映射为一张数据库表，并提供简单的SQL查询功能，可以将SQL语句转换为MapReduce任务进行运行。 其优点是学习成本低，可以通过类SQL语句快速实现简单的MapReduce统计，不必开发专门的MapReduce应用，十分适合数据仓库的统计分析。</p> <p>10）R语言：R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件，它是一个用于统计计算和统计制图的优秀工具。</p> <p>11）Mahout：Apache Mahout是个可扩展的机器学习和数据挖掘库。</p> <p>12）ZooKeeper：Zookeeper是Google的Chubby一个开源的实现。它是一个针对大型分布式系统的可靠协调系统，提供的功能包括：配置维护、名字服务、 分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务，将简单易用的接口和性能高效、功能稳定的系统提供给用户。</p> <h2 id=22>2.2 推荐系统框架图</h2> <p>推荐系统项目架构如图2-27所示。</p> <p>图2-27 推荐系统项目架构</p> <h2 id=23-hadoop>2.3 Hadoop是什么</h2> <h2 id=24-hadoop>2.4 Hadoop发展历史</h2> <h2 id=25-hadoop>2.5 Hadoop三大发行版本</h2> <p>Hadoop三大发行版本：Apache、Cloudera、Hortonworks。</p> <p>Apache版本最原始（最基础）的版本，对于入门学习最好。</p> <blockquote> <p>Cloudera在大型互联网企业中用的较多。</p> <p>Hortonworks文档较好。</p> </blockquote> <ol> <li>Apache Hadoop</li> </ol> <blockquote> <p>官网地址：<a href=http://hadoop.apache.org/releases.html>http://hadoop.apache.org/releases.html</a></p> <p>下载地址：<a href=https://archive.apache.org/dist/hadoop/common/ >https://archive.apache.org/dist/hadoop/common/</a></p> </blockquote> <ol> <li>Cloudera Hadoop</li> </ol> <blockquote> <p>官网地址：<a href=https://www.cloudera.com/downloads/cdh/5-10-0.html>https://www.cloudera.com/downloads/cdh/5-10-0.html</a></p> <p>下载地址：<a href=http://archive-primary.cloudera.com/cdh5/cdh/5/ >http://archive-primary.cloudera.com/cdh5/cdh/5/</a></p> </blockquote> <p>（1）2008年成立的Cloudera是最早将Hadoop商用的公司，为合作伙伴提供Hadoop的商用解决方案，主要是包括支持、咨询服务、培训。</p> <p><strong>（2）2009年Hadoop的创始人Doug Cutting也加盟Cloudera公司</strong>。Cloudera产品主要为CDH，Cloudera Manager，Cloudera Support</p> <p>（3）CDH是Cloudera的Hadoop发行版，完全开源，比Apache Hadoop在兼容性，安全性，稳定性上有所增强。</p> <p>（4）Cloudera Manager是集群的软件分发及管理监控平台，可以在几个小时内部署好一个Hadoop集群，并对集群的节点及服务进行实时监控。Cloudera Support即是对Hadoop的技术支持。</p> <p>（5）Cloudera的标价为每年每个节点4000美元。Cloudera开发并贡献了可实时处理大数据的Impala项目。</p> <ol> <li>Hortonworks Hadoop</li> </ol> <blockquote> <p>官网地址：<a href=https://hortonworks.com/products/data-center/hdp/ >https://hortonworks.com/products/data-center/hdp/</a></p> <p>下载地址：<a href=https://hortonworks.com/downloads/ >https://hortonworks.com/downloads/</a>#data-platform</p> <p>（1）2011年成立的Hortonworks是雅虎与硅谷风投公司Benchmark Capital合资组建。</p> </blockquote> <p><strong>（2）公司成立之初就吸纳了大约25名至30名专门研究Hadoop的雅虎工程师，上述工程师均在2005年开始协助雅虎开发Hadoop，贡献了Hadoop80%的代码。</strong></p> <p>（3）雅虎工程副总裁、雅虎Hadoop开发团队负责人Eric Baldeschwieler出任Hortonworks的首席执行官。</p> <p>（4）Hortonworks的主打产品是Hortonworks Data Platform（HDP），也同样是100%开源的产品，HDP除常见的项目外还包括了Ambari，一款开源的安装和管理系统。</p> <p>（5）HCatalog，一个元数据管理系统，HCatalog现已集成到Facebook开源的Hive中。Hortonworks的Stinger开创性的极大的优化了Hive项目。Hortonworks为入门提供了一个非常好的，易于使用的沙盒。</p> <p>（6）Hortonworks开发了很多增强特性并提交至核心主干，这使得Apache Hadoop能够在包括Window Server和Windows Azure在内的Microsoft Windows平台上本地运行。定价以集群为基础，每10个节点每年为12500美元。</p> <h2 id=26hadoop4>2.6Hadoop的优势（4高）</h2> <h2 id=27-hadoop>2.7 Hadoop组成</h2> <p>图2-21 Hadoop1.x与Hadoop2.x的区别</p> <h3 id=271-hdfs>2.7.1 HDFS架构概述</h3> <p>HDFS（Hadoop Distributed File System）的架构概述，如图2-23所示。</p> <p>图2-23 HDFS架构概述</p> <h3 id=272-yarn>2.7.2 YARN架构概述</h3> <p>YARN架构概述，如图2-24所示。</p> <p>图2-24 YARN架构概述</p> <h3 id=273-mapreduce>2.7.3 MapReduce架构概述</h3> <p>MapReduce将计算过程分为两个阶段：Map和Reduce，如图2-25所示</p> <p>1）Map阶段并行处理输入数据</p> <p>2）Reduce阶段对Map结果进行汇总</p> <p>图2-25 MapReduce架构概述</p> <h2 id=3-hadoop>第3章 Hadoop运行环境搭建（开发重点）</h2> <h2 id=31>3.1 虚拟机环境准备</h2> <ol> <li> <p>克隆虚拟机</p> </li> <li> <p>修改克隆虚拟机的静态IP</p> </li> <li> <p>修改主机名</p> </li> <li> <p>关闭防火墙</p> </li> <li> <p>创建用户</p> </li> <li> <p>配置用户具有root权限</p> </li> </ol> <p>7．在/opt目录下创建文件夹</p> <blockquote> <p>（1）在/opt目录下创建module、software文件夹</p> <p>[atguigu\@hadoop101 opt]$ sudo mkdir module</p> <p>[atguigu\@hadoop101 opt]$ sudo mkdir software</p> </blockquote> <p>（2）修改module、software文件夹的所有者cd</p> <blockquote> <p>[atguigu\@hadoop101 opt]$ sudo chown atguigu:atguigu module/ software/</p> <p>[atguigu\@hadoop101 opt]$ ll</p> <p>总用量 8</p> <p>drwxr-xr-x. 2 atguigu atguigu 4096 1月 17 14:37 module</p> <p>drwxr-xr-x. 2 atguigu atguigu 4096 1月 17 14:38 software</p> </blockquote> <h2 id=32-jdk>3.2 安装JDK</h2> <ol> <li>卸载现有JDK</li> </ol> <p>（1）查询是否安装Java软件：</p> <blockquote> <p>[atguigu\@hadoop101 opt]$ rpm -qa | grep java</p> </blockquote> <p>（2）如果安装的版本低于1.7，卸载该JDK：</p> <blockquote> <p>[atguigu\@hadoop101 opt]$ sudo rpm -e 软件包</p> </blockquote> <p>（3）查看JDK安装路径：</p> <blockquote> <p>[atguigu\@hadoop101 ~]$ which java</p> </blockquote> <ol> <li>用SecureCRT工具将JDK导入到opt目录下面的software文件夹下面，如图2-28所示</li> </ol> <p><img alt=1516413529(1) src=b95dfe8ed5fd443388ebe18c2ddcf874.png></p> <p>图2-28 导入JDK</p> <p>“alt+p”进入sftp模式，如图2-29所示</p> <p><img alt=1516413579(1) src=552a0616e5ca5387f2be34eeb780f694.png></p> <p>图2-29 进入sftp模式</p> <p>选择jdk1.8拖入，如图2-30，2-31所示</p> <p><img alt=1516413707 src=9e17f15e8a0485baa2fe04b544983348.png></p> <p>图2-30 拖入jdk1.8</p> <p><img alt src=da53122ef323a2398b29635deb701ad2.png></p> <p>图2-31 拖入jdk1.8完成</p> <ol> <li>在Linux系统下的opt目录中查看软件包是否导入成功</li> </ol> <blockquote> <p>[atguigu\@hadoop101 opt]$ cd software/</p> <p>[atguigu\@hadoop101 software]$ ls</p> <p>hadoop-2.7.2.tar.gz jdk-8u144-linux-x64.tar.gz</p> </blockquote> <ol> <li>解压JDK到/opt/module目录下</li> </ol> <blockquote> <p>[atguigu\@hadoop101 software]$ tar -zxvf jdk-8u144-linux-x64.tar.gz -C /opt/module/</p> </blockquote> <ol> <li>配置JDK环境变量</li> </ol> <p>（1）先获取JDK路径</p> <blockquote> <p>[atguigu\@hadoop101 jdk1.8.0_144]$ pwd</p> <p>/opt/module/jdk1.8.0_144</p> </blockquote> <p>（2）打开/etc/profile文件</p> <blockquote> <p>[atguigu\@hadoop101 software]$ sudo vi /etc/profile</p> <p>在profile文件末尾添加JDK路径</p> <p>#JAVA_HOME</p> <p>export JAVA_HOME=/opt/module/jdk1.8.0_144</p> <p>export PATH=$PATH:$JAVA_HOME/bin</p> </blockquote> <p>（3）保存后退出</p> <blockquote> <p>:wq</p> </blockquote> <p>（4）让修改后的文件生效</p> <blockquote> <p>[atguigu\@hadoop101 jdk1.8.0_144]$ source /etc/profile</p> </blockquote> <ol> <li>测试JDK是否安装成功</li> </ol> <blockquote> <p>[atguigu\@hadoop101 jdk1.8.0_144]# java -version</p> <p>java version &ldquo;1.8.0_144&rdquo;</p> </blockquote> <p>注意：重启（如果java -version可以用就不用重启）</p> <blockquote> <p>[atguigu\@hadoop101 jdk1.8.0_144]$ sync</p> <p>[atguigu\@hadoop101 jdk1.8.0_144]$ sudo reboot</p> </blockquote> <h2 id=33-hadoop>3.3 安装Hadoop</h2> <ol> <li>Hadoop下载地址：</li> </ol> <p><a href=https://archive.apache.org/dist/hadoop/common/hadoop-2.7.2/ >https://archive.apache.org/dist/hadoop/common/hadoop-2.7.2/</a></p> <ol> <li>用SecureCRT工具将hadoop-2.7.2.tar.gz导入到opt目录下面的software文件夹下面</li> </ol> <p>切换到sftp连接页面，选择Linux下编译的hadoop jar包拖入，如图2-32所示</p> <p><img alt=1516414194(1) src=5ca11a51ac00035261c1273ccdce4360.png></p> <p>图2-32 拖入hadoop的tar包</p> <p><img alt=1516414274(1) src=0c724610730729165a924d62a1d5044b.png></p> <p>图2-33 拖入Hadoop的tar包成功</p> <ol> <li>进入到Hadoop安装包路径下</li> </ol> <blockquote> <p>[atguigu\@hadoop101 ~]$ cd /opt/software/</p> </blockquote> <ol> <li>解压安装文件到/opt/module下面</li> </ol> <blockquote> <p>[atguigu\@hadoop101 software]$ tar -zxvf hadoop-2.7.2.tar.gz -C /opt/module/</p> </blockquote> <ol> <li>查看是否解压成功</li> </ol> <blockquote> <p>[atguigu\@hadoop101 software]$ ls /opt/module/</p> <p>hadoop-2.7.2</p> </blockquote> <ol> <li>将Hadoop添加到环境变量</li> </ol> <p>（1）获取Hadoop安装路径</p> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ pwd</p> <p>/opt/module/hadoop-2.7.2</p> </blockquote> <p>（2）打开/etc/profile文件</p> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ sudo vi /etc/profile</p> <p>在profile文件末尾添加JDK路径：（shitf+g）</p> <p>##HADOOP_HOME</p> <p>export HADOOP_HOME=/opt/module/hadoop-2.7.2</p> <p>export PATH=$PATH:$HADOOP_HOME/bin</p> <p>export PATH=$PATH:$HADOOP_HOME/sbin</p> </blockquote> <p>（3）保存后退出</p> <blockquote> <p>:wq</p> </blockquote> <p>（4）让修改后的文件生效</p> <blockquote> <p>[atguigu\@ hadoop101 hadoop-2.7.2]$ source /etc/profile</p> </blockquote> <ol> <li>测试是否安装成功</li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ hadoop version</p> <p>Hadoop 2.7.2</p> </blockquote> <ol> <li>重启(如果Hadoop命令不能用再重启)</li> </ol> <blockquote> <p>[atguigu\@ hadoop101 hadoop-2.7.2]$ sync</p> <p>[atguigu\@ hadoop101 hadoop-2.7.2]$ sudo reboot</p> </blockquote> <h2 id=34-hadoop>3.4 Hadoop目录结构</h2> <p>1、查看Hadoop目录结构</p> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ ll</p> <p>总用量 52</p> <p>drwxr-xr-x. 2 atguigu atguigu 4096 5月 22 2017 <strong>bin</strong></p> <p>drwxr-xr-x. 3 atguigu atguigu 4096 5月 22 2017 <strong>etc</strong></p> <p>drwxr-xr-x. 2 atguigu atguigu 4096 5月 22 2017 include</p> <p>drwxr-xr-x. 3 atguigu atguigu 4096 5月 22 2017 <strong>lib</strong></p> <p>drwxr-xr-x. 2 atguigu atguigu 4096 5月 22 2017 libexec</p> <p>-rw-r&ndash;r&ndash;. 1 atguigu atguigu 15429 5月 22 2017 LICENSE.txt</p> <p>-rw-r&ndash;r&ndash;. 1 atguigu atguigu 101 5月 22 2017 NOTICE.txt</p> <p>-rw-r&ndash;r&ndash;. 1 atguigu atguigu 1366 5月 22 2017 README.txt</p> <p>drwxr-xr-x. 2 atguigu atguigu 4096 5月 22 2017 <strong>sbin</strong></p> <p>drwxr-xr-x. 4 atguigu atguigu 4096 5月 22 2017 <strong>share</strong></p> </blockquote> <p>2、重要目录</p> <p>（1）bin目录：存放对Hadoop相关服务（HDFS,YARN）进行操作的脚本</p> <p>（2）etc目录：Hadoop的配置文件目录，存放Hadoop的配置文件</p> <p>（3）lib目录：存放Hadoop的本地库（对数据进行压缩解压缩功能）</p> <p>（4）sbin目录：存放启动或停止Hadoop相关服务的脚本</p> <p>（5）share目录：存放Hadoop的依赖jar包、文档、和官方案例</p> <h2 id=4-hadoop>第4章 Hadoop运行模式</h2> <p>Hadoop运行模式包括：本地模式、伪分布式模式以及完全分布式模式。</p> <p>Hadoop官方网站：<a href=http://hadoop.apache.org/ >http://hadoop.apache.org/</a></p> <h2 id=41>4.1 本地运行模式</h2> <h3 id=411-grep>4.1.1 官方Grep案例</h3> <ol> <li>创建在hadoop-2.7.2文件下面创建一个input文件夹</li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ mkdir input</p> </blockquote> <ol> <li>将Hadoop的xml配置文件复制到input</li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ cp etc/hadoop/*.xml input</p> </blockquote> <ol> <li>执行share目录下的MapReduce程序</li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ bin/hadoop jar</p> <p>share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output &lsquo;dfs[a-z.]+&rsquo;</p> </blockquote> <ol> <li>查看输出结果</li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ cat output/*</p> </blockquote> <h3 id=412-wordcount>4.1.2 官方WordCount案例</h3> <ol> <li>创建在hadoop-2.7.2文件下面创建一个wcinput文件夹</li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ mkdir wcinput</p> </blockquote> <ol> <li>在wcinput文件下创建一个wc.input文件</li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ cd wcinput</p> <p>[atguigu\@hadoop101 wcinput]$ touch wc.input</p> </blockquote> <ol> <li>编辑wc.input文件</li> </ol> <blockquote> <p>[atguigu\@hadoop101 wcinput]$ vi wc.input</p> </blockquote> <p>在文件中输入如下内容</p> <blockquote> <p>hadoop yarn</p> <p>hadoop mapreduce</p> <p>atguigu</p> <p>atguigu</p> <p>保存退出：：wq</p> </blockquote> <ol> <li> <p>回到Hadoop目录/opt/module/hadoop-2.7.2</p> </li> <li> <p>执行程序</p> </li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ hadoop jar</p> <p>share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput</p> </blockquote> <ol> <li>查看结果</li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ cat wcoutput/part-r-00000</p> <p>atguigu 2</p> <p>hadoop 2</p> <p>mapreduce 1</p> <p>yarn 1</p> </blockquote> <h2 id=42>4.2 伪分布式运行模式</h2> <h3 id=421-hdfsmapreduce>4.2.1 启动HDFS并运行MapReduce程序</h3> <ol> <li>分析</li> </ol> <p>（1）配置集群</p> <p>（2）启动、测试集群增、删、查</p> <p>（3）执行WordCount案例</p> <ol> <li>执行步骤</li> </ol> <p>（1）配置集群</p> <p>（a）配置：hadoop-env.sh</p> <blockquote> <p>Linux系统中获取JDK的安装路径：</p> <p>[atguigu\@ hadoop101 ~]# echo $JAVA_HOME</p> <p>/opt/module/jdk1.8.0_144</p> <p>修改JAVA_HOME 路径：</p> <p>export JAVA_HOME=/opt/module/jdk1.8.0_144</p> <p>（b）配置：core-site.xml</p> </blockquote> <table> <thead> <tr> <th>\&lt;!&ndash; 指定HDFS中NameNode的地址 &ndash;> \&lt;property> \&lt;name>fs.defaultFS\&lt;/name> \&lt;value>hdfs://hadoop101:9000\&lt;/value> \&lt;/property> \&lt;!&ndash; 指定Hadoop运行时产生文件的存储目录 &ndash;> \&lt;property> \&lt;name>hadoop.tmp.dir\&lt;/name> \&lt;value>/opt/module/hadoop-2.7.2/data/tmp\&lt;/value> \&lt;/property></th> </tr> </thead> <tbody> <tr> <td></td> </tr> </tbody> </table> <blockquote> <p>（c）配置：hdfs-site.xml</p> </blockquote> <table> <thead> <tr> <th>\&lt;!&ndash; 指定HDFS副本的数量 &ndash;> \&lt;property> \&lt;name>dfs.replication\&lt;/name> \&lt;value>1\&lt;/value> \&lt;/property></th> </tr> </thead> <tbody> <tr> <td></td> </tr> </tbody> </table> <p>（2）启动集群</p> <blockquote> <p>（a）<strong>格式化NameNode</strong>（第一次启动时格式化，以后就不要总格式化）</p> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ bin/hdfs namenode -format</p> </blockquote> <p>（b）启动NameNode</p> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode</p> </blockquote> <p>（c）启动DataNode</p> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode</p> </blockquote> <p>（3）查看集群</p> <p>（a）查看是否启动成功</p> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ jps</p> <p>13586 NameNode</p> <p>13668 DataNode</p> <p>13786 Jps</p> <p>注意：jps是JDK中的命令，不是Linux命令。不安装JDK不能使用jps</p> </blockquote> <p>（b）web端查看HDFS文件系统</p> <blockquote> <p><em><a href=http://hadoop101:50070/dfshealth.html>http://hadoop101:50070/dfshealth.html</a>#tab-overview</em></p> <p>注意：如果不能查看，看如下帖子处理</p> <p><a href=http://www.cnblogs.com/zlslch/p/6604189.html>http://www.cnblogs.com/zlslch/p/6604189.html</a></p> </blockquote> <p>（c）查看产生的Log日志</p> <p>说明：在企业中遇到Bug时，经常根据日志提示信息去分析问题、解决Bug。</p> <blockquote> <p>当前目录：/opt/module/hadoop-2.7.2/logs</p> <p>[atguigu\@hadoop101 logs]$ ls</p> <p>hadoop-atguigu-datanode-hadoop.atguigu.com.log</p> <p>hadoop-atguigu-datanode-hadoop.atguigu.com.out</p> <p>hadoop-atguigu-namenode-hadoop.atguigu.com.log</p> <p>hadoop-atguigu-namenode-hadoop.atguigu.com.out</p> <p>SecurityAuth-root.audit</p> <p>[atguigu\@hadoop101 logs]# cat hadoop-atguigu-datanode-hadoop101.log</p> <p><strong>（d）思考：为什么不能一直格式化NameNode，格式化NameNode，要注意什么？</strong></p> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ cd data/tmp/dfs/name/current/</p> <p>[atguigu\@hadoop101 current]$ cat VERSION</p> <p><strong>clusterID=CID-f0330a58-36fa-4a2a-a65f-2688269b5837</strong></p> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ cd data/tmp/dfs/data/current/</p> <p><strong>clusterID=CID-f0330a58-36fa-4a2a-a65f-2688269b5837</strong></p> <p>注意：格式化NameNode，会产生新的集群id,导致NameNode和DataNode的集群id不一致，集群找不到已往数据。所以，格式NameNode时，一定要先删除data数据和log日志，然后再格式化NameNode。</p> </blockquote> <p>（4）操作集群</p> <p>（a）在HDFS文件系统上**创建**一个input文件夹</p> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -mkdir -p /user/atguigu/input</p> </blockquote> <p>（b）将测试文件内容**上传**到文件系统上</p> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$bin/hdfs dfs -put wcinput/wc.input</p> <p>/user/atguigu/input/</p> </blockquote> <p>（c）**查看**上传的文件是否正确</p> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -ls /user/atguigu/input/</p> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -cat /user/atguigu/ input/wc.input</p> </blockquote> <p>（d）运行MapReduce程序</p> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ bin/hadoop jar</p> <p>share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/atguigu/input/ /user/atguigu/output</p> </blockquote> <p>（e）查看输出结果</p> <blockquote> <p>命令行查看：</p> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -cat /user/atguigu/output/*</p> <p>浏览器查看，如图2-34所示</p> </blockquote> <p><img alt src=3787e41aebe9c23a29d5db647f8fb939.png></p> <p>图2-34 查看output文件</p> <p>（f）将测试文件内容**下载**到本地</p> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ hdfs dfs -get /user/atguigu/output/part-r-00000 ./wcoutput/</p> <p>（g）**删除**输出结果</p> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ hdfs dfs -rm -r /user/atguigu/output</p> </blockquote> <h3 id=422-yarnmapreduce>4.2.2 启动YARN并运行MapReduce程序</h3> <ol> <li>分析</li> </ol> <p>（1）配置集群在YARN上运行MR</p> <p>（2）启动、测试集群增、删、查</p> <p>（3）在YARN上执行WordCount案例</p> <ol> <li>执行步骤</li> </ol> <p>（1）配置集群</p> <p>（a）配置yarn-env.sh</p> <blockquote> <p>配置一下JAVA_HOME</p> <p>export JAVA_HOME=/opt/module/jdk1.8.0_144</p> <p>（b）配置yarn-site.xml</p> <p>\&lt;!&ndash; Reducer获取数据的方式 &ndash;></p> <p>\&lt;property></p> <p>\&lt;name>yarn.nodemanager.aux-services\&lt;/name></p> <p>\&lt;value>mapreduce_shuffle\&lt;/value></p> <p>\&lt;/property></p> <p>\&lt;!&ndash; 指定YARN的ResourceManager的地址 &ndash;></p> <p>\&lt;property></p> <p>\&lt;name>yarn.resourcemanager.hostname\&lt;/name></p> <p>\&lt;value>hadoop101\&lt;/value></p> <p>\&lt;/property></p> </blockquote> <p>（c）配置：mapred-env.sh</p> <blockquote> <p>配置一下JAVA_HOME</p> <p>export JAVA_HOME=/opt/module/jdk1.8.0_144</p> </blockquote> <p>（d）配置： (对mapred-site.xml.template重新命名为) mapred-site.xml</p> <blockquote> <p>[atguigu\@hadoop101 hadoop]$ mv mapred-site.xml.template mapred-site.xml</p> <p>[atguigu\@hadoop101 hadoop]$ vi mapred-site.xml</p> <p>\&lt;!&ndash; 指定MR运行在YARN上 &ndash;></p> <p>\&lt;property></p> <p>\&lt;name>mapreduce.framework.name\&lt;/name></p> <p>\&lt;value>yarn\&lt;/value></p> <p>\&lt;/property></p> </blockquote> <p>（2）启动集群</p> <blockquote> <p>（a）启动前必须保证NameNode和DataNode已经启动</p> <p>（b）启动ResourceManager</p> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager</p> <p>（c）启动NodeManager</p> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager</p> </blockquote> <p>（3）集群操作</p> <blockquote> <p>（a）YARN的浏览器页面查看，如图2-35所示</p> <p><a href=http://hadoop101:8088/cluster>http://hadoop101:8088/cluster</a></p> </blockquote> <p><img alt src=b5edaf6097aafab9aa62f6f921c9b130.png></p> <p>图2-35 YARN的浏览器页面</p> <p>（b）删除文件系统上的output文件</p> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -rm -R /user/atguigu/output</p> </blockquote> <p>（c）执行MapReduce程序</p> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ bin/hadoop jar</p> <p>share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/atguigu/input /user/atguigu/output</p> </blockquote> <p>（d）查看运行结果，如图2-36所示</p> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -cat /user/atguigu/output/*</p> </blockquote> <p><img alt src=e5df0d6f9e257c945f50260824d29dd4.png></p> <p>图2-36 查看运行结果</p> <h3 id=423>4.2.3 配置历史服务器</h3> <p>为了查看程序的历史运行情况，需要配置一下历史服务器。具体配置步骤如下：</p> <ol> <li>配置mapred-site.xml</li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop]$ vi mapred-site.xml</p> <p>在该文件里面增加如下配置。</p> <p>\&lt;!&ndash; 历史服务器端地址 &ndash;></p> <p>\&lt;property></p> <p>\&lt;name>mapreduce.jobhistory.address\&lt;/name></p> <p>\&lt;value>hadoop101:10020\&lt;/value></p> <p>\&lt;/property></p> <p>\&lt;!&ndash; 历史服务器web端地址 &ndash;></p> <p>\&lt;property></p> <p>\&lt;name>mapreduce.jobhistory.webapp.address\&lt;/name></p> <p>\&lt;value>hadoop101:19888\&lt;/value></p> <p>\&lt;/property></p> </blockquote> <ol> <li>启动历史服务器</li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh start historyserver</p> </blockquote> <ol> <li>查看历史服务器是否启动</li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ jps</p> </blockquote> <ol> <li>查看JobHistory</li> </ol> <p><em><a href=http://hadoop101:19888/jobhistory>http://hadoop101:19888/jobhistory</a></em></p> <h3 id=424>4.2.4 配置日志的聚集</h3> <p>日志聚集概念：应用运行完成以后，将程序运行日志信息上传到HDFS系统上。</p> <p>日志聚集功能好处：可以方便的查看到程序运行详情，方便开发调试。</p> <p>注意：开启日志聚集功能，需要重新启动NodeManager 、ResourceManager和HistoryManager。</p> <p>开启日志聚集功能具体步骤如下：</p> <ol> <li>配置yarn-site.xml</li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop]$ vi yarn-site.xml</p> <p>在该文件里面增加如下配置。</p> <p>\&lt;!&ndash; 日志聚集功能使能 &ndash;></p> <p>\&lt;property></p> <p>\&lt;name>yarn.log-aggregation-enable\&lt;/name></p> <p>\&lt;value>true\&lt;/value></p> <p>\&lt;/property></p> <p>\&lt;!&ndash; 日志保留时间设置7天 &ndash;></p> <p>\&lt;property></p> <p>\&lt;name>yarn.log-aggregation.retain-seconds\&lt;/name></p> <p>\&lt;value>604800\&lt;/value></p> <p>\&lt;/property></p> </blockquote> <ol> <li>关闭NodeManager 、ResourceManager和HistoryManager</li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop resourcemanager</p> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop nodemanager</p> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh stop historyserver</p> </blockquote> <ol> <li>启动NodeManager 、ResourceManager和HistoryManager</li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager</p> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager</p> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh start historyserver</p> </blockquote> <ol> <li>删除HDFS上已经存在的输出文件</li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -rm -R /user/atguigu/output</p> </blockquote> <ol> <li>执行WordCount程序</li> </ol> <blockquote> <p>[atguigu\@hadoop101 hadoop-2.7.2]$ hadoop jar</p> <p>share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/atguigu/input /user/atguigu/output</p> </blockquote> <ol> <li>查看日志，如图2-37，2-38，2-39所示</li> </ol> <blockquote> <p><a href=http://hadoop101:19888/jobhistory>http://hadoop101:19888/jobhistory</a></p> </blockquote> <p><img alt src=906226f48752657c99e30b9b71097e1c.png></p> <p>图2-37 Job History</p> <p><img alt src=d3a65e6bd851c30a525ad0b1605185a4.png></p> <p>图2-38 job运行情况</p> <p><img alt src=108ed001c18eebd596442596df100cf6.png></p> <p>图2-39 查看日志</p> <h3 id=425>4.2.5 配置文件说明</h3> <p>Hadoop配置文件分两类：默认配置文件和自定义配置文件，只有用户想修改某一默认配置值时，才需要修改自定义配置文件，更改相应属性值。</p> <p>（1）默认配置文件：</p> <p>表2-1</p> <table> <thead> <tr> <th>要获取的默认文件</th> <th>文件存放在Hadoop的jar包中的位置</th> </tr> </thead> <tbody> <tr> <td>[core-default.xml]</td> <td>hadoop-common-2.7.2.jar/ core-default.xml</td> </tr> <tr> <td>[hdfs-default.xml]</td> <td>hadoop-hdfs-2.7.2.jar/ hdfs-default.xml</td> </tr> <tr> <td>[yarn-default.xml]</td> <td>hadoop-yarn-common-2.7.2.jar/ yarn-default.xml</td> </tr> <tr> <td>[mapred-default.xml]</td> <td>hadoop-mapreduce-client-core-2.7.2.jar/ mapred-default.xml</td> </tr> </tbody> </table> <p>（2）自定义配置文件：</p> <p>**core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml**四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上，用户可以根据项目需求重新进行修改配置。</p> <h2 id=43>4.3 完全分布式运行模式（重点）</h2> <p>分析：</p> <p>1）准备3台客户机（关闭防火墙、静态ip、主机名称）</p> <p>2）安装JDK</p> <p>3）配置环境变量</p> <p>4）安装Hadoop</p> <p>5）配置环境变量</p> <p>6）配置集群</p> <p>7）单点启动</p> <p>8）配置ssh</p> <p>9）群起并测试集群</p> <h3 id=431>4.3.1 虚拟机准备</h3> <p>详见3.1章。</p> <h3 id=432-xsync>4.3.2 编写集群分发脚本xsync</h3> <ol> <li>scp（secure copy）安全拷贝</li> </ol> <p>（1）scp定义：</p> <blockquote> <p>scp可以实现服务器与服务器之间的数据拷贝。（from server1 to server2）</p> </blockquote> <p>（2）基本语法</p> <blockquote> <p>scp -r $pdir/$fname $user\@hadoop$host:$pdir/$fname</p> <p>命令 递归 要拷贝的文件路径/名称 目的用户\@主机:目的路径/名称</p> </blockquote> <p>（3）案例实操</p> <blockquote> <p>（a）在hadoop101上，将hadoop101中/opt/module目录下的软件拷贝到hadoop102上。</p> <p>[atguigu\@hadoop101 /]$ scp -r /opt/module root\@hadoop102:/opt/module</p> <p>（b）在hadoop103上，将hadoop101服务器上的/opt/module目录下的软件拷贝到hadoop103上。</p> <p>[atguigu\@hadoop103 opt]$sudo scp -r atguigu\@hadoop101:/opt/module root\@hadoop103:/opt/module</p> <p>（c）在hadoop103上操作将hadoop101中/opt/module目录下的软件拷贝到hadoop104上。</p> <p>[atguigu\@hadoop103 opt]$ scp -r atguigu\@hadoop101:/opt/module root\@hadoop104:/opt/module</p> <p>注意：拷贝过来的/opt/module目录，别忘了在hadoop102、hadoop103、hadoop104上修改所有文件的，所有者和所有者组。sudo chown atguigu:atguigu -R /opt/module</p> <p>（d）将hadoop101中/etc/profile文件拷贝到hadoop102的/etc/profile上。</p> <p>[atguigu\@hadoop101 ~]$ sudo scp /etc/profile root\@hadoop102:/etc/profile</p> <p>（e）将hadoop101中/etc/profile文件拷贝到hadoop103的/etc/profile上。</p> <p>[atguigu\@hadoop101 ~]$ sudo scp /etc/profile root\@hadoop103:/etc/profile</p> <p>（f）将hadoop101中/etc/profile文件拷贝到hadoop104的/etc/profile上。</p> <p>[atguigu\@hadoop101 ~]$ sudo scp /etc/profile root\@hadoop104:/etc/profile</p> <p>注意：拷贝过来的配置文件别忘了source一下/etc/profile，。</p> </blockquote> <ol> <li>rsync 远程同步工具</li> </ol> <p>rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。</p> <p>rsync和scp区别：用rsync做文件的复制要比scp的速度快，rsync只对差异文件做更新。scp是把所有文件都复制过去。</p> <p>（1）基本语法</p> <blockquote> <p>rsync -rvl $pdir/$fname $user\@hadoop$host:$pdir/$fname</p> <p>命令 选项参数 要拷贝的文件路径/名称 目的用户\@主机:目的路径/名称</p> </blockquote> <p>选项参数说明</p> <p>表2-2</p> <table> <thead> <tr> <th>选项</th> <th>功能</th> </tr> </thead> <tbody> <tr> <td>-r</td> <td>递归</td> </tr> <tr> <td>-v</td> <td>显示复制过程</td> </tr> <tr> <td>-l</td> <td>拷贝符号连接</td> </tr> </tbody> </table> <p>（2）案例实操</p> <p>（a）把hadoop101机器上的/opt/software目录同步到hadoop102服务器的root用户下的/opt/目录</p> <blockquote> <p>[atguigu\@hadoop101 opt]$ rsync -rvl /opt/software/ root\@hadoop102:/opt/software</p> </blockquote> <ol> <li>xsync集群分发脚本</li> </ol> <p>（1）需求：循环复制文件到所有节点的相同目录下</p> <p>（2）需求分析：</p> <blockquote> <p>（a）rsync命令原始拷贝：</p> <p>rsync -rvl /opt/module root\@hadoop103:/opt/</p> </blockquote> <p>（b）期望脚本：</p> <blockquote> <p>xsync要同步的文件名称</p> </blockquote> <p>（c）说明：在/home/atguigu/bin这个目录下存放的脚本，atguigu用户可以在系统任何地方直接执行。</p> <p>（3）脚本实现</p> <blockquote> <p>（a）在/home/atguigu目录下创建bin目录，并在bin目录下xsync创建文件，文件内容如下：</p> <p>[atguigu\@hadoop102 ~]$ mkdir bin</p> <p>[atguigu\@hadoop102 ~]$ cd bin/</p> <p>[atguigu\@hadoop102 bin]$ touch xsync</p> <p>[atguigu\@hadoop102 bin]$ vi xsync</p> <p>在该文件中编写如下代码</p> <p>#!/bin/bash</p> <p>#1 获取输入参数个数，如果没有参数，直接退出</p> <p>pcount=$#</p> <p>if((pcount==0)); then</p> <p>echo no args;</p> <p>exit;</p> <p>fi</p> <p>#2 获取文件名称</p> <p>p1=$1</p> <p>fname=`basename $p1`</p> <p>echo fname=$fname</p> <p>#3 获取上级目录到绝对路径</p> <p>pdir=`cd -P $(dirname $p1); pwd`</p> <p>echo pdir=$pdir</p> <p>#4 获取当前用户名称</p> <p>user=`whoami`</p> <p>#5 循环</p> <p>for((host=103; host\&lt;105; host++)); do</p> <p>echo ------------------- hadoop$host --------------</p> <p>rsync -rvl $pdir/$fname $user\@hadoop$host:$pdir</p> <p>done</p> <p>（b）修改脚本 xsync 具有执行权限</p> <p>[atguigu\@hadoop102 bin]$ chmod 777 xsync</p> <p>（c）调用脚本形式：xsync 文件名称</p> <p>[atguigu\@hadoop102 bin]$ xsync /home/atguigu/bin</p> <p>注意：如果将xsync放到/home/atguigu/bin目录下仍然不能实现全局使用，可以将xsync移动到/usr/local/bin目录下。</p> </blockquote> <h3 id=433>4.3.3 集群配置</h3> <ol> <li>集群部署规划</li> </ol> <p>表2-3</p> <table> <thead> <tr> <th></th> <th>hadoop102</th> <th>hadoop103</th> <th>hadoop104</th> </tr> </thead> <tbody> <tr> <td>HDFS</td> <td>NameNode DataNode</td> <td>DataNode</td> <td>SecondaryNameNode DataNode</td> </tr> <tr> <td>YARN</td> <td>NodeManager</td> <td>ResourceManager NodeManager</td> <td>NodeManager</td> </tr> </tbody> </table> <ol> <li>配置集群</li> </ol> <p>（1）核心配置文件</p> <blockquote> <p>配置core-site.xml</p> <p>[atguigu\@hadoop102 hadoop]$ vi core-site.xml</p> <p>在该文件中编写如下配置</p> <p>\&lt;!&ndash; 指定HDFS中NameNode的地址 &ndash;></p> <p>\&lt;property></p> <p>\&lt;name>fs.defaultFS\&lt;/name></p> <p>\&lt;value>hdfs://hadoop102:9000\&lt;/value></p> <p>\&lt;/property></p> <p>\&lt;!&ndash; 指定Hadoop运行时产生文件的存储目录 &ndash;></p> <p>\&lt;property></p> <p>\&lt;name>hadoop.tmp.dir\&lt;/name></p> <p>\&lt;value>/opt/module/hadoop-2.7.2/data/tmp\&lt;/value></p> <p>\&lt;/property></p> </blockquote> <p>（2）HDFS配置文件</p> <blockquote> <p>配置hadoop-env.sh</p> <p>[atguigu\@hadoop102 hadoop]$ vi hadoop-env.sh</p> <p>export JAVA_HOME=/opt/module/jdk1.8.0_144</p> <p>配置hdfs-site.xml</p> <p>[atguigu\@hadoop102 hadoop]$ vi hdfs-site.xml</p> <p>在该文件中编写如下配置</p> <p>\&lt;property></p> <p>\&lt;name>dfs.replication\&lt;/name></p> <p>\&lt;value>3\&lt;/value></p> <p>\&lt;/property></p> <p>\&lt;!&ndash; 指定Hadoop辅助名称节点主机配置 &ndash;></p> <p>\&lt;property></p> <p>\&lt;name>dfs.namenode.secondary.http-address\&lt;/name></p> <p>\&lt;value>hadoop104:50090\&lt;/value></p> <p>\&lt;/property></p> <p>（3）YARN配置文件</p> <p>配置yarn-env.sh</p> <p>[atguigu\@hadoop102 hadoop]$ vi yarn-env.sh</p> <p>export JAVA_HOME=/opt/module/jdk1.8.0_144</p> <p>配置yarn-site.xml</p> <p>[atguigu\@hadoop102 hadoop]$ vi yarn-site.xml</p> <p>在该文件中增加如下配置</p> <p>\&lt;!&ndash; Reducer获取数据的方式 &ndash;></p> <p>\&lt;property></p> <p>\&lt;name>yarn.nodemanager.aux-services\&lt;/name></p> <p>\&lt;value>mapreduce_shuffle\&lt;/value></p> <p>\&lt;/property></p> <p>\&lt;!&ndash; 指定YARN的ResourceManager的地址 &ndash;></p> <p>\&lt;property></p> <p>\&lt;name>yarn.resourcemanager.hostname\&lt;/name></p> <p>\&lt;value>hadoop103\&lt;/value></p> <p>\&lt;/property></p> <p>（4）MapReduce配置文件</p> <p>配置mapred-env.sh</p> <p>[atguigu\@hadoop102 hadoop]$ vi mapred-env.sh</p> <p>export JAVA_HOME=/opt/module/jdk1.8.0_144</p> <p>配置mapred-site.xml</p> <p>[atguigu\@hadoop102 hadoop]$ cp mapred-site.xml.template mapred-site.xml</p> <p>[atguigu\@hadoop102 hadoop]$ vi mapred-site.xml</p> <p>在该文件中增加如下配置</p> <p>\&lt;!&ndash; 指定MR运行在Yarn上 &ndash;></p> <p>\&lt;property></p> <p>\&lt;name>mapreduce.framework.name\&lt;/name></p> <p>\&lt;value>yarn\&lt;/value></p> <p>\&lt;/property></p> </blockquote> <p>3．在集群上分发配置好的Hadoop配置文件</p> <blockquote> <p>[atguigu\@hadoop102 hadoop]$ xsync /opt/module/hadoop-2.7.2/</p> </blockquote> <p>4．查看文件分发情况</p> <blockquote> <p>[atguigu\@hadoop103 hadoop]$ cat /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml</p> </blockquote> <h3 id=434>4.3.4 集群单点启动</h3> <p>（1）如果集群是第一次启动，需要**格式化NameNode**</p> <blockquote> <p>[atguigu\@hadoop102 hadoop-2.7.2]$ hadoop namenode -format</p> </blockquote> <p>（2）在hadoop102上启动NameNode</p> <blockquote> <p>[atguigu\@hadoop102 hadoop-2.7.2]$ hadoop-daemon.sh start namenode</p> <p>[atguigu\@hadoop102 hadoop-2.7.2]$ jps</p> <p>3461 NameNode</p> </blockquote> <p>（3）在hadoop102、hadoop103以及hadoop104上分别启动DataNode</p> <blockquote> <p>[atguigu\@hadoop102 hadoop-2.7.2]$ hadoop-daemon.sh start datanode</p> <p>[atguigu\@hadoop102 hadoop-2.7.2]$ jps</p> <p>3461 NameNode</p> <p>3608 Jps</p> <p>3561 DataNode</p> <p>[atguigu\@hadoop103 hadoop-2.7.2]$ hadoop-daemon.sh start datanode</p> <p>[atguigu\@hadoop103 hadoop-2.7.2]$ jps</p> <p>3190 DataNode</p> <p>3279 Jps</p> <p>[atguigu\@hadoop104 hadoop-2.7.2]$ hadoop-daemon.sh start datanode</p> <p>[atguigu\@hadoop104 hadoop-2.7.2]$ jps</p> <p>3237 Jps</p> <p>3163 DataNode</p> </blockquote> <p>（4）思考：每次都一个一个节点启动，如果节点数增加到1000个怎么办？</p> <p>早上来了开始一个一个节点启动，到晚上下班刚好完成，下班？</p> <p><img alt src=070e265c87bbefabcbd98d2e9a8e5329.png></p> <h3 id=435-ssh>4.3.5 SSH无密登录配置</h3> <ol> <li>配置ssh</li> </ol> <p>（1）基本语法</p> <blockquote> <p>ssh另一台电脑的ip地址</p> </blockquote> <p>（2）ssh连接时出现Host key verification failed的解决方法</p> <blockquote> <p>[atguigu\@hadoop102 opt] $ ssh 192.168.1.103</p> <p>The authenticity of host &lsquo;192.168.1.103 (192.168.1.103)&rsquo; can&rsquo;t be established.</p> <p>RSA key fingerprint is cf:1e:de:d7:d0:4c:2d:98:60:b4:fd<img alt=🇦🇪 class=emojione src=https://cdnjs.cloudflare.com/ajax/libs/emojione/2.2.7/assets/png/1f1e6-1f1ea.png title=:ae:>b1:2d:ad:06.</p> <p>Are you sure you want to continue connecting (yes/no)?</p> <p>Host key verification failed.</p> <p>（3）解决方案如下：直接输入yes</p> </blockquote> <ol> <li>无密钥配置</li> </ol> <p>（1）免密登录原理，如图2-40所示</p> <p>图2-40 免密登陆原理</p> <p>（2）生成公钥和私钥：</p> <blockquote> <p>[atguigu\@hadoop102 .ssh]$ ssh-keygen -t rsa</p> <p>然后敲（三个回车），就会生成两个文件id_rsa（私钥）、id_rsa.pub（公钥）</p> </blockquote> <p>（3）将公钥拷贝到要免密登录的目标机器上</p> <blockquote> <p>[atguigu\@hadoop102 .ssh]$ ssh-copy-id hadoop102</p> <p>[atguigu\@hadoop102 .ssh]$ ssh-copy-id hadoop103</p> <p>[atguigu\@hadoop102 .ssh]$ ssh-copy-id hadoop104</p> <p>注意：</p> <p>还需要在hadoop102上采用root账号，配置一下无密登录到hadoop102、hadoop103、hadoop104；</p> <p>还需要在hadoop103上采用atguigu账号配置一下无密登录到hadoop102、hadoop103、hadoop104服务器上。</p> </blockquote> <ol> <li>.ssh文件夹下（~/.ssh）的文件功能解释</li> </ol> <p>表2-4</p> <table> <thead> <tr> <th>known_hosts</th> <th>记录ssh访问过计算机的公钥(public key)</th> </tr> </thead> <tbody> <tr> <td>id_rsa</td> <td>生成的私钥</td> </tr> <tr> <td>id_rsa.pub</td> <td>生成的公钥</td> </tr> <tr> <td>authorized_keys</td> <td>存放授权过得无密登录服务器公钥</td> </tr> </tbody> </table> <h3 id=436>4.3.6 群起集群</h3> <ol> <li>配置slaves</li> </ol> <blockquote> <p>/opt/module/hadoop-2.7.2/etc/hadoop/slaves</p> <p>[atguigu\@hadoop102 hadoop]$ vi slaves</p> <p>在该文件中增加如下内容：</p> <p>hadoop102</p> <p>hadoop103</p> <p>hadoop104</p> <p>注意：该文件中添加的内容结尾不允许有空格，文件中不允许有空行。</p> <p>同步所有节点配置文件</p> <p>[atguigu\@hadoop102 hadoop]$ xsync slaves</p> </blockquote> <ol> <li>启动集群</li> </ol> <p>（1）如果集群是第一次启动，需要格式化NameNode（注意格式化之前，一定要先停止上次启动的所有namenode和datanode进程，然后再删除data和log数据）</p> <blockquote> <p>[atguigu\@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -format</p> <p>（2）启动HDFS</p> <p>[atguigu\@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh</p> <p>[atguigu\@hadoop102 hadoop-2.7.2]$ jps</p> <p>4166 NameNode</p> <p>4482 Jps</p> <p>4263 DataNode</p> <p>[atguigu\@hadoop103 hadoop-2.7.2]$ jps</p> <p>3218 DataNode</p> <p>3288 Jps</p> <p>[atguigu\@hadoop104 hadoop-2.7.2]$ jps</p> <p>3221 DataNode</p> <p>3283 SecondaryNameNode</p> <p>3364 Jps</p> </blockquote> <p>（3）启动YARN</p> <blockquote> <p>[atguigu\@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh</p> <p>注意：NameNode和ResourceManger如果不是同一台机器，不能在NameNode上启动 YARN，应该在ResouceManager所在的机器上启动YARN。</p> <p>（4）Web端查看SecondaryNameNode</p> <p>（a）浏览器中输入：<em><a href=http://hadoop104:50090/status.html>http://hadoop104:50090/status.html</a></em></p> </blockquote> <p>（b）查看SecondaryNameNode信息，如图2-41所示。</p> <p><img alt src=866a395e70687503543b30e000851e4f.png></p> <blockquote> <p>图2-41 SecondaryNameNode的Web端</p> </blockquote> <ol> <li>集群基本测试</li> </ol> <p>（1）上传文件到集群</p> <p>上传小文件</p> <blockquote> <p>[atguigu\@hadoop102 hadoop-2.7.2]$ hdfs dfs -mkdir -p /user/atguigu/input</p> <p>[atguigu\@hadoop102 hadoop-2.7.2]$ hdfs dfs -put wcinput/wc.input /user/atguigu/input</p> </blockquote> <p>上传大文件</p> <blockquote> <p>[atguigu\@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -put</p> <p>/opt/software/hadoop-2.7.2.tar.gz /user/atguigu/input</p> </blockquote> <p>（2）上传文件后查看文件存放在什么位置</p> <blockquote> <p>（a）查看HDFS文件存储路径</p> <p>[atguigu\@hadoop102 subdir0]$ pwd</p> <p>/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-938951106-192.168.10.107-1495462844069/current/finalized/subdir0/subdir0</p> <p>（b）查看HDFS在磁盘存储文件内容</p> <p>[atguigu\@hadoop102 subdir0]$ cat blk_1073741825</p> <p>hadoop yarn</p> <p>hadoop mapreduce</p> <p>atguigu</p> <p>atguigu</p> </blockquote> <p>（3）拼接</p> <blockquote> <p>-rw-rw-r&ndash;. 1 atguigu atguigu 134217728 5月 23 16:01 <strong>blk_1073741836</strong></p> <p>-rw-rw-r&ndash;. 1 atguigu atguigu 1048583 5月 23 16:01 blk_1073741836_1012.meta</p> <p>-rw-rw-r&ndash;. 1 atguigu atguigu 63439959 5月 23 16:01 <strong>blk_1073741837</strong></p> <p>-rw-rw-r&ndash;. 1 atguigu atguigu 495635 5月 23 16:01 blk_1073741837_1013.meta</p> <p>[atguigu\@hadoop102 subdir0]$ cat blk_1073741836>>tmp.file</p> <p>[atguigu\@hadoop102 subdir0]$ cat blk_1073741837>>tmp.file</p> <p>[atguigu\@hadoop102 subdir0]$ tar -zxvf tmp.file</p> </blockquote> <p>（4）下载</p> <blockquote> <p>[atguigu\@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -get</p> <p>/user/atguigu/input/hadoop-2.7.2.tar.gz ./</p> </blockquote> <h3 id=437>4.3.7 集群启动/停止方式总结</h3> <ol> <li>各个服务组件逐一启动/停止</li> </ol> <p>（1）分别启动/停止HDFS组件</p> <p>hadoop-daemon.sh start / stop namenode / datanode / secondarynamenode</p> <p>（2）启动/停止YARN</p> <p>yarn-daemon.sh start / stop resourcemanager / nodemanager</p> <ol> <li>各个模块分开启动/停止（配置ssh是前提）常用</li> </ol> <p>（1）整体启动/停止HDFS</p> <p>start-dfs.sh / stop-dfs.sh</p> <p>（2）整体启动/停止YARN</p> <p>start-yarn.sh / stop-yarn.sh</p> <h3 id=438>4.3.8 集群时间同步</h3> <p>时间同步的方式：找一个机器，作为时间服务器，所有的机器与这台集群时间进行定时的同步，比如，每隔十分钟，同步一次时间。</p> <p><strong>配置时间同步具体实操：</strong></p> <ol> <li>时间服务器配置（必须root用户）</li> </ol> <p>（1）检查ntp是否安装</p> <blockquote> <p>[<strong>root</strong>\@hadoop102 桌面]# rpm -qa|grep ntp</p> </blockquote> <p>ntp-4.2.6p5-10.el6.centos.x86_64</p> <p>fontpackages-filesystem-1.41-1.1.el6.noarch</p> <p>ntpdate-4.2.6p5-10.el6.centos.x86_64</p> <p>（2）修改ntp配置文件</p> <blockquote> <p>[<strong>root</strong>\@hadoop102 桌面]# vi /etc/ntp.conf</p> <p>修改内容如下</p> <p>a）修改1（授权192.168.1.0-192.168.1.255网段上的所有机器可以从这台机器上查询和同步时间）</p> <p>**#**restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap为</p> <p>restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap</p> </blockquote> <p>b）修改2（集群在局域网中，不使用其他互联网上的时间）</p> <blockquote> <p>server 0.centos.pool.ntp.org iburst</p> <p>server 1.centos.pool.ntp.org iburst</p> <p>server 2.centos.pool.ntp.org iburst</p> <p>server 3.centos.pool.ntp.org iburst为</p> <p>**#**server 0.centos.pool.ntp.org iburst</p> <p>**#**server 1.centos.pool.ntp.org iburst</p> <p>**#**server 2.centos.pool.ntp.org iburst</p> <p>**#**server 3.centos.pool.ntp.org iburst</p> <p>c）添加3（当该节点丢失网络连接，依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步）</p> <p>server 127.127.1.0</p> <p>fudge 127.127.1.0 stratum 10</p> </blockquote> <p>（3）修改/etc/sysconfig/ntpd 文件</p> <blockquote> <p>[<strong>root</strong>\@hadoop102 桌面]# vim /etc/sysconfig/ntpd</p> <p>增加内容如下（让硬件时间与系统时间一起同步）</p> <p>SYNC_HWCLOCK=yes</p> </blockquote> <p>（4）重新启动ntpd服务</p> <blockquote> <p>[<strong>root</strong>\@hadoop102 桌面]# service ntpd status</p> </blockquote> <p>ntpd 已停</p> <blockquote> <p>[<strong>root</strong>\@hadoop102 桌面]# service ntpd start</p> <p>正在启动 ntpd： [确定]</p> </blockquote> <p>（5）设置ntpd服务开机启动</p> <blockquote> <p>[<strong>root</strong>\@hadoop102 桌面]# chkconfig ntpd on</p> </blockquote> <ol> <li>其他机器配置（必须root用户）</li> </ol> <p>（1）在其他机器配置10分钟与时间服务器同步一次</p> <blockquote> <p>[<strong>root</strong>\@hadoop103桌面]# crontab -e</p> <p>编写定时任务如下：</p> <p>*/10 * * * * /usr/sbin/ntpdate hadoop102</p> </blockquote> <p>（2）修改任意机器时间</p> <blockquote> <p>[<strong>root</strong>\@hadoop103桌面]# date -s &ldquo;2017-9-11 11:11:11&rdquo;</p> </blockquote> <p>（3）十分钟后查看机器是否与时间服务器同步</p> <blockquote> <p>[<strong>root</strong>\@hadoop103桌面]# date</p> <p>说明：测试的时候可以将10分钟调整为1分钟，节省时间。</p> </blockquote> <h2 id=5-hadoop>第5章 Hadoop编译源码（重点）</h2> <h2 id=51>5.1 前期准备工作</h2> <ol> <li>CentOS联网</li> </ol> <p>配置CentOS能连接外网。Linux虚拟机ping <a href=http://www.baidu.com>www.baidu.com</a> 是畅通的</p> <p>注意：采用root角色编译，减少文件夹权限出现问题</p> <ol> <li>jar包准备(hadoop源码、JDK8、maven、ant 、protobuf)</li> </ol> <p>（1）hadoop-2.7.2-src.tar.gz</p> <p>（2）jdk-8u144-linux-x64.tar.gz</p> <p>（3）apache-ant-1.9.9-bin.tar.gz（build工具，打包用的）</p> <p>（4）apache-maven-3.0.5-bin.tar.gz</p> <p>（5）protobuf-2.5.0.tar.gz（序列化的框架）</p> <h2 id=52-jar>5.2 jar包安装</h2> <p>注意：所有操作必须在root用户下完成</p> <ol> <li>JDK解压、配置环境变量 JAVA_HOME和PATH，验证<a href=http://lib.csdn.net/base/javase>java</a>-version(如下都需要验证是否配置成功)</li> </ol> <blockquote> <p>[root\@hadoop101 software] # tar -zxf jdk-8u144-linux-x64.tar.gz -C /opt/module/</p> <p>[root\@hadoop101 software]# vi /etc/profile</p> <p>#JAVA_HOME：</p> <p>export JAVA_HOME=/opt/module/jdk1.8.0_144</p> <p>export PATH=$PATH:$JAVA_HOME/bin</p> <p>[root\@hadoop101 software]#source /etc/profile</p> <p><strong>验证命令：java -version</strong></p> </blockquote> <ol> <li>Maven解压、配置  MAVEN_HOME和PATH</li> </ol> <blockquote> <p>[root\@hadoop101 software]# tar -zxvf apache-maven-3.0.5-bin.tar.gz -C /opt/module/</p> <p>[root\@hadoop101 apache-maven-3.0.5]# vi conf/settings.xml</p> <p>\&lt;mirrors></p> <p>\&lt;!&ndash; mirror</p> <p>| Specifies a repository mirror site to use instead of a given repository. The repository that</p> <p>| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used</p> <p>| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.</p> <p>|</p> <p>\&lt;mirror></p> <p>\&lt;id>mirrorId\&lt;/id></p> <p>\&lt;mirrorOf>repositoryId\&lt;/mirrorOf></p> <p>\&lt;name>Human Readable Name for this Mirror.\&lt;/name></p> <p>\&lt;url><a href=http://my.repository.com/repo/path>http://my.repository.com/repo/path</a>\&lt;/url></p> <p>\&lt;/mirror></p> <p>--></p> <p>\&lt;mirror></p> <p>\&lt;id>nexus-aliyun\&lt;/id></p> <p>\&lt;mirrorOf>central\&lt;/mirrorOf></p> <p>\&lt;name>Nexus aliyun\&lt;/name></p> <p>\&lt;url><a href=http://maven.aliyun.com/nexus/content/groups/public>http://maven.aliyun.com/nexus/content/groups/public</a>\&lt;/url></p> <p>\&lt;/mirror></p> <p>\&lt;/mirrors></p> <p>[root\@hadoop101 apache-maven-3.0.5]# vi /etc/profile</p> <p>#MAVEN_HOME</p> <p>export MAVEN_HOME=/opt/module/apache-maven-3.0.5</p> <p>export PATH=$PATH:$MAVEN_HOME/bin</p> <p>[root\@hadoop101 software]#source /etc/profile</p> <p><strong>验证命令：mvn -version</strong></p> </blockquote> <ol> <li>ant解压、配置  ANT _HOME和PATH</li> </ol> <blockquote> <p>[root\@hadoop101 software]# tar -zxvf apache-ant-1.9.9-bin.tar.gz -C /opt/module/</p> <p>[root\@hadoop101 apache-ant-1.9.9]# vi /etc/profile</p> <p>#ANT_HOME</p> <p>export ANT_HOME=/opt/module/apache-ant-1.9.9</p> <p>export PATH=$PATH:$ANT_HOME/bin</p> <p>[root\@hadoop101 software]#source /etc/profile</p> <p><strong>验证命令：ant -version</strong></p> </blockquote> <ol> <li>安装  glibc-headers 和  g++  命令如下</li> </ol> <blockquote> <p>[root\@hadoop101 apache-ant-1.9.9]# yum install glibc-headers</p> <p>[root\@hadoop101 apache-ant-1.9.9]# yum install gcc-c++</p> </blockquote> <ol> <li>安装make和cmake</li> </ol> <blockquote> <p>[root\@hadoop101 apache-ant-1.9.9]# yum install make</p> <p>[root\@hadoop101 apache-ant-1.9.9]# yum install cmake</p> </blockquote> <ol> <li>解压protobuf ，进入到解压后protobuf主目录，/opt/module/protobuf-2.5.0，然后相继执行命令</li> </ol> <blockquote> <p>[root\@hadoop101 software]# tar -zxvf protobuf-2.5.0.tar.gz -C /opt/module/</p> <p>[root\@hadoop101 opt]# cd /opt/module/protobuf-2.5.0/</p> <p>[root\@hadoop101 protobuf-2.5.0]#./configure </p> <p>[root\@hadoop101 protobuf-2.5.0]# make </p> <p>[root\@hadoop101 protobuf-2.5.0]# make check </p> <p>[root\@hadoop101 protobuf-2.5.0]# make install </p> <p>[root\@hadoop101 protobuf-2.5.0]# ldconfig </p> <p>[root\@hadoop101 hadoop-dist]# vi /etc/profile</p> <p>#LD_LIBRARY_PATH</p> <p>export LD_LIBRARY_PATH=/opt/module/protobuf-2.5.0</p> <p>export PATH=$PATH:$LD_LIBRARY_PATH</p> <p>[root\@hadoop101 software]#source /etc/profile</p> <p><strong>验证命令：protoc &ndash;version</strong></p> </blockquote> <ol> <li>安装openssl库</li> </ol> <blockquote> <p>[root\@hadoop101 software]#yum install openssl-devel</p> </blockquote> <ol> <li>安装 ncurses-devel库</li> </ol> <blockquote> <p>[root\@hadoop101 software]#yum install ncurses-devel</p> <p>到此，编译工具安装基本完成。</p> </blockquote> <h2 id=53>5.3 编译源码</h2> <ol> <li>解压源码到/opt/目录</li> </ol> <blockquote> <p>[root\@hadoop101 software]# tar -zxvf hadoop-2.7.2-src.tar.gz -C /opt/</p> </blockquote> <ol> <li>进入到hadoop源码主目录</li> </ol> <blockquote> <p>[root\@hadoop101 hadoop-2.7.2-src]# pwd</p> <p>/opt/hadoop-2.7.2-src</p> </blockquote> <ol> <li>通过maven执行编译命令</li> </ol> <blockquote> <p>[root\@hadoop101 hadoop-2.7.2-src]#mvn package -Pdist,native -DskipTests -Dtar</p> <p>等待时间30分钟左右，最终成功是全部SUCCESS，如图2-42所示。</p> </blockquote> <p>图2-42 编译源码</p> <ol> <li>成功的64位hadoop包在/opt/hadoop-2.7.2-src/hadoop-dist/target下</li> </ol> <blockquote> <p>[root\@hadoop101 target]# pwd</p> <p>/opt/hadoop-2.7.2-src/hadoop-dist/target</p> </blockquote> <ol> <li>编译源码过程中常见的问题及解决方案</li> </ol> <p>（1）MAVEN install时候JVM内存溢出</p> <p>处理方式：在环境配置文件和maven的执行文件均可调整MAVEN_OPT的heap大小。（详情查阅MAVEN 编译 JVM调优问题，如：<a href=http://outofmemory.cn/code-snippet/12652/maven-outofmemoryerror-method>http://outofmemory.cn/code-snippet/12652/maven-outofmemoryerror-method</a>）</p> <p>（2）编译期间maven报错。可能网络阻塞问题导致依赖库下载不完整导致，多次执行命令（一次通过比较难）：</p> <p>[root\@hadoop101 hadoop-2.7.2-src]#mvn package -Pdist,nativeN -DskipTests -Dtar</p> <p>（3）报ant、protobuf等错误，插件下载未完整或者插件版本问题，最开始链接有较多特殊情况，同时推荐</p> <p>2.7.0版本的问题汇总帖子 <a href=http://www.tuicool.com/articles/IBn63qf>http://www.tuicool.com/articles/IBn63qf</a></p> <h2 id=6>第6章 常见错误及解决方案</h2> <p>1）防火墙没关闭、或者没有启动YARN</p> <p><em>INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032</em></p> <p>2）主机名称配置错误</p> <p>3）IP地址配置错误</p> <p>4）ssh没有配置好</p> <p>5）root用户和atguigu两个用户启动集群不统一</p> <p>6）配置文件修改不细心</p> <p>7）未编译源码</p> <blockquote> <p><em>Unable to load native-hadoop library for your platform&hellip; using builtin-java classes where applicable</em></p> <p><em>17/05/22 15:38:58 INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032</em></p> </blockquote> <p>8）不识别主机名称</p> <blockquote> <p>java.net.UnknownHostException: hadoop102: hadoop102</p> <p>at java.net.InetAddress.getLocalHost(InetAddress.java:1475)</p> <p>at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:146)</p> <p>at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)</p> <p>at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)</p> <p>at java.security.AccessController.doPrivileged(Native Method)</p> <p>at javax.security.auth.Subject.doAs(Subject.java:415)</p> </blockquote> <p>解决办法：</p> <p>（1）在/etc/hosts文件中添加192.168.1.102 hadoop102</p> <p>（2）主机名称不要起hadoop hadoop000等特殊名称</p> <p>9）DataNode和NameNode进程同时只能工作一个。</p> <p>10）执行命令不生效，粘贴word中命令时，遇到-和长–没区分开。导致命令失效</p> <p>解决办法：尽量不要粘贴word中代码。</p> <p>11）jps发现进程已经没有，但是重新启动集群，提示进程已经开启。原因是在linux的根目录下/tmp目录中存在启动的进程临时文件，将集群相关进程删除掉，再重新启动集群。</p> <p>12）jps不生效。</p> <p>原因：全局变量hadoop java没有生效。解决办法：需要source /etc/profile文件。</p> <p>13）8088端口连接不上</p> <p>[atguigu\@hadoop102 桌面]$ cat /etc/hosts</p> <p>注释掉如下代码</p> <p>#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4</p> <p>#::1 hadoop102</p> </article> </div> </div> </main> <footer class=md-footer> <div class=md-footer-nav> <nav class="md-footer-nav__inner md-grid" aria-label=Footer> <a href=../../%E4%B8%AD%E9%97%B4%E4%BB%B6/RocketMQ/ title=RocketMQ class="md-footer-nav__link md-footer-nav__link--prev" rel=prev> <div class="md-footer-nav__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg> </div> <div class=md-footer-nav__title> <div class=md-ellipsis> <span class=md-footer-nav__direction> 上一页 </span> RocketMQ </div> </div> </a> <a href=../Hadoop-HDFS/ title=HDFS class="md-footer-nav__link md-footer-nav__link--next" rel=next> <div class=md-footer-nav__title> <div class=md-ellipsis> <span class=md-footer-nav__direction> 下一页 </span> HDFS </div> </div> <div class="md-footer-nav__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4z"/></svg> </div> </a> </nav> </div> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-footer-copyright> <div class=md-footer-copyright__highlight> Copyright &copy; 2018 - 2029 Dayet 296577630@qq.com </div> Made with <a href=https://squidfunk.github.io/mkdocs-material/ target=_blank rel=noopener> Material for MkDocs </a> </div> </div> </div> </footer> </div> <script src=../../assets/javascripts/vendor.2d1db4bd.min.js></script> <script src=../../assets/javascripts/bundle.6627ddf3.min.js></script><script id=__lang type=application/json>{"clipboard.copy": "\u590d\u5236", "clipboard.copied": "\u5df2\u590d\u5236", "search.config.lang": "ja", "search.config.pipeline": "trimmer, stemmer", "search.config.separator": "[\\uff0c\\u3002]+", "search.result.placeholder": "\u952e\u5165\u4ee5\u5f00\u59cb\u641c\u7d22", "search.result.none": "\u6ca1\u6709\u627e\u5230\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.one": "\u627e\u5230 1 \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.other": "# \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c"}</script> <script>
        app = initialize({
          base: "../..",
          features: [],
          search: Object.assign({
            worker: "../../assets/javascripts/worker/search.5eca75d3.min.js"
          }, typeof search !== "undefined" && search)
        })
      </script> </body> </html>